#pragma once

#include "common.hpp"
#include "opencv2/opencv.hpp"

namespace painting {

const auto kCV_FONT = cv::FONT_HERSHEY_SIMPLEX;

const cv::Scalar kBLUE(255., 0., 0.);
const cv::Scalar kGREEN(0., 255., 0.);
const cv::Scalar kRED(0., 0., 255.);
const cv::Scalar kYELLOW(0., 255., 255.);
const cv::Scalar kBLACK(0., 0., 0.);

}  // namespace painting

namespace component {

enum DetectModel {
  kMODEL_FACE = 1,
  kMODEL_NOSE = 2,
  kMODEL_EYE = 4,
  kMODEL_YOLO = 8,
};

void Draw(const cv::Mat& output, const cv::Rect2f& rect,
          const cv::Scalar& color, bool add_lable,
          cv::MarkerTypes type = cv::MarkerTypes::MARKER_DIAMOND);

void DrawInfo(const cv::Mat& output, const std::string& info, int level,
              const cv::Scalar& color);

cv::Rect2i Area(const cv::Rect2i& ri, const cv::Rect2i& rj);

// cv::Point2i Convert(const LidarPoint& pt, double offest);
cv::Point2i Convert(const LidarPoint& pt, double offest);

inline cv::Point AutoCenter(const cv::Rect2i& rect) {
  return (rect.tl() + rect.br()) / 2;
}

inline double Distance(const cv::Point& pt1, const cv::Point& pt2) {
  return cv::norm(pt1 - pt2);
}

cv::Mat ViualizeBackground();

bool VisualizeLidarNode(cv::Mat& background,
                        const std::vector<component::LidarPoint>& points);

}  // namespace component
